package br.com.fogas.medicao.activity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.widget.TextView;
import br.com.fogas.database.FogasDatabase;
import br.com.fogas.database.entidade.NotaFiscal;
import br.com.fogas.medicao.R;
import br.com.fogas.medicao.activity.dto.RetornoAutorizacaoNotaDto;
import br.com.fogas.medicao.application.ApplicationFogas;
import br.com.fogas.medicao.application.Constants;
import br.com.fogas.medicao.thread.AutorizarNotaOnlineThread;
import br.com.fogas.medicao.thread.AutorizarNotaOnlineCronometroThread;
import br.com.fogas.medicao.thread.ThreadEventListener;
import br.com.fogas.notafiscal.exception.ClienteBloqueadoSefazException;
import br.com.fogas.notafiscal.exception.NotaNaoEmitidaException;
import br.com.fogas.webservice.service.FogasWebservice;

public class ConcluirSimulNotaActivity extends Activity {

    private Thread cronometro;
    private Thread autorizarNota;
    private Handler handler;
    
    private NotaFiscal notaImpressao;
    private FogasDatabase database;
    private FogasWebservice webservice;
	private TextView cronometroTitulo;
	private TextView cronometroSubTitulo;

	private int segundosEsperaAutorizacao;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.concluir_simul_nota);
		
		this.notaImpressao = (NotaFiscal) getIntent().getExtras().getSerializable(Constants.NOTA_SIMULACAO);
		
		this.cronometroTitulo = (TextView) findViewById(R.id.labelTitulo);
		this.cronometroSubTitulo = (TextView) findViewById(R.id.labelSubTitulo);
		this.segundosEsperaAutorizacao = ApplicationFogas.getInstance().getConfiguracao().getAppDados().getTempo_espera_aut_nfe();
		
		this.database = new FogasDatabase(this);
		this.webservice = new FogasWebservice(this);
		
		this.handler = new Handler();
		
		this.cronometro = new AutorizarNotaOnlineCronometroThread(this, cronometroListener);
		this.autorizarNota = new AutorizarNotaOnlineThread(this, autorizarNotaListener);
		this.iniciarThreads();
	}
	
	private void iniciarThreads() {
		this.cronometro.start();
		this.autorizarNota.start();
	}
	
	ThreadEventListener cronometroListener = new ThreadEventListener() {
		
		@Override
		public void threadComplete(Thread thread, Exception exception) {
			Log.d(Constants.AUTORIZACAO_NOTA, "thread Cronometro finalizada!");
			//cronometro.interrupt();
			//cronometro = null;
		}
	};
	
	ThreadEventListener autorizarNotaListener = new ThreadEventListener() {
		
		@Override
		public void threadComplete(Thread thread, Exception exception) {
			Log.d(Constants.AUTORIZACAO_NOTA, "thread autorizacao nota finalizada!");
			cronometro.interrupt();
			//cronometro = null;
			autorizarNota.interrupt();
			//autorizarNota = null;
			
			impressao(exception);
		}
	};
	
	private void impressao(Exception exception) {
		Log.d(Constants.AUTORIZACAO_NOTA, "redirecionado para impressao!");
		
		Intent intent = new Intent(ConcluirSimulNotaActivity.this, MainActivity.class);
		
		RetornoAutorizacaoNotaDto retorno = new RetornoAutorizacaoNotaDto(notaImpressao, true, false, false);
		
		if(exception instanceof ClienteBloqueadoSefazException) {
			retorno.setBloqueadoSefaz(true);
		} else if(exception instanceof NotaNaoEmitidaException) {
			retorno.setEmitirContigencia(true);
		};
		
		intent.putExtra(Constants.RETORNO_AUTORIZACAO_NOTA, retorno);
		ConcluirSimulNotaActivity.this.startActivity(intent);
		finish();
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		this.database.fecharConexao();
	}
	
	@Override
	protected void onResume() {
		super.onResume();
	}
	
	public void atualizarCronometro(final String titulo) {
		handler.post(new Runnable() {
			public void run() {
				segundosEsperaAutorizacao--;
				cronometroTitulo.setText(titulo);
			}
		});
	}
	
	public void atualizarStatus(final String status) {
		handler.post(new Runnable() {
			public void run() {
				cronometroSubTitulo.setText(status);
			}
		});
	}

	public Handler getHandler() {
		return handler;
	}

	public FogasDatabase getDatabase() {
		return database;
	}

	public FogasWebservice getWebservice() {
		return webservice;
	}
	
	public NotaFiscal getNotaImpressao() {
		return notaImpressao;
	}
	
	public int getSegundosEsperaAutorizacao() {
		return segundosEsperaAutorizacao;
	}
}